package ViewsTUI;

import Controllers.*;
import Models.*;
import byggemarked.Console;
import java.util.ArrayList;

/**
 * @author Thomas
 */
public class SupplierView
{
	private SupplierCTR controller;

	public SupplierView()
	{
		this.controller = new SupplierCTR();
		ArrayList<String> options = new ArrayList<String>();
		options.add("Tilføj leverandør");
		options.add("Find leverandør");
		options.add("Hent leverandør");
		options.add("Redigér leverandør");
		options.add("Slet Leverandør");

		boolean isTimeToQuit = false;
		while(!isTimeToQuit)
		{
			Console.printMenu(true, "Leverandør", options);
			int choice = Console.readChoice(0, 4);
			switch(choice)
			{
				case 1: addSupplier();		break;
				case 2:	findSupplier();		break;
				case 3: getSupplier();		break;
				case 4: editSupplier();		break;
				case 5: removeSupplier();	break;
				case 0: isTimeToQuit = true;
			}
		}
	}

	private void addSupplier()
	{
		Console.print("Indtast navn");
		String name = Console.readString();

		Console.print("Indtast adresse:");
		String address = Console.readString();

		Console.print("Indtast post nummer:");
		int zipCode = Console.readInt();

		Console.print("Indtast by:");
		String city = Console.readString();

		Console.print("Indtast telefonnummer:");
		int phoneNo = Console.readInt();

		Console.print("Indtast navn på kontaktperson:");
		String contact = Console.readString();

		Console.print("Indtast CVR nummmer:");
		int cvr = Console.readInt();

		this.controller.addSupplier(name, address, zipCode, city, phoneNo, contact, cvr);
	}

	private void findSupplier(boolean standAlone)
	{
		Console.print("For at søge efter en kunde skal du indtaste mindst et af søgekriterierne.");
		Console.print("Indtast leverandørnavn:");
		String name = Console.readString(true);

		Console.print("Indtast adresse:");
		String address = Console.readString(true);

		Console.print("Indtast post nummer:");
		int zipCode = Console.readInt(true);

		Console.print("Indtast by:");
		String city = Console.readString(true);

		Console.print("Indtast telefonnummer:");
		int phoneNo = Console.readInt(true);

		Console.print("Indtast kontaktperson:");
		String contact = Console.readString(true);

		Console.print("Indtast CVR nummmer:");
		int cvr = Console.readInt(true);

		ArrayList<Supplier> suppliers = this.controller.findSupplier(name, address, zipCode, city, phoneNo, contact, cvr);
        if(suppliers.size() > 0)
		{
			this.showList(suppliers);
			if(standAlone)
			{
				Console.print("Indtast den ønskede leverandørs ID, som står ude til venstre i listen.");
				int id = Console.readInt();
				Supplier supplier = this.controller.getSupplier(id);
				if(supplier != null)
				{
					this.showInfo(supplier);
				}
				else
				{
					Console.print("Der kunne ikke findes nogen leverandør med det valgte ID.");
				}
			}
		}
		else
		{
			Console.print("Der fandtes ingen leverandører med de indtastede søgekriterier.");
		}
	}

	private void findSupplier()
	{
		this.findSupplier(true);
	}

	private void getSupplier()
	{
		Console.print("Indtast leverandørens ID.");
		int supplierInt = Console.readInt();
		Supplier supplier = this.controller.getSupplier(supplierInt);
		if(supplier != null)
		{
			showInfo(supplier);
		}
		else
		{
			Console.print("Der kunne ikke findes nogen leverandør med det valgte ID.");
		}
	}

	private void editSupplier()
	{
		Console.print("For at redigere en leverandør, skal den først findes.");
		Supplier supplier = null;
		boolean hasValidSupplier = false;
		while(!hasValidSupplier)
		{
			try
			{
				supplier = searchProcedure();
				if(supplier != null)
				{
					hasValidSupplier = true;
				}
				else
				{
					return;
				}
			}
			catch(Exception e)
			{ }
		}
		Console.print("Du får nu muligheden for at redigere de enkelte felter seperat. Hvis et felt ikke ønskes ændret, springes feltet over med ENTER. Den nuværende værdi i feltet vises i parantes i linien ovenover.");

		Console.print("Indtast navn ("+supplier.getName()+"):");
			String name = Console.readString(true);
			if(!name.equals("")) { supplier.setName(name); }

		Console.print("Indtast adresse ("+supplier.getAddress()+"):");
		String address = Console.readString(true);
		if(!address.equals("")) { supplier.setAddress(address); }

		Console.print("Indtast post nummer ("+supplier.getZipCode()+"):");
		int zipCode = Console.readInt(true);
		if(zipCode != 0) { supplier.setZipCode(zipCode); }

		Console.print("Indtast by ("+supplier.getCity()+"):");
		String city = Console.readString(true);
		if(!city.equals("")) { supplier.setCity(city); }

		Console.print("Indtast telefonnummer ("+supplier.getPhoneNo()+"):");
		int phoneNo = Console.readInt(true);
		if(phoneNo != 0) { supplier.setPhoneNo(phoneNo); }

		Console.print("Indtast navn på kontaktperson ("+supplier.getContact()+"):");
		String contact = Console.readString(true);
		if(!contact.equals("")) { supplier.setContact(contact); }

		Console.print("Indtast CVR nummer ("+supplier.getCvr()+"):");
		int cvr = Console.readInt(true);
		if(cvr != 0) { supplier.setCvr(cvr); }
	}

	private void removeSupplier()
	{
		Console.print("For at slette en leverandør, skal den først findes.");
		Supplier supplier = null;
		boolean hasValidSupplier = false;
		while(!hasValidSupplier)
		{
			try
			{
				supplier = searchProcedure();
				if(supplier != null)
				{
					hasValidSupplier = true;
				}
				else
				{
					return;
				}
			}
			catch(Exception e)
			{ }
		}
		String name = supplier.getName();
		this.controller.removeSupplier(supplier);
		Console.print(name+"er nu slettet fra kundedatabasen.");
	}

	private Supplier searchProcedure() throws Exception
	{
		Console.print("Hvordan vil du finde leverandøren?");
		ArrayList<String> options = new ArrayList<String>();
		options.add("ID");
		options.add("Søgning");
		options.add("Liste");
		Console.printMenu(false, null, options);

		int choice = Console.readChoice(0, 3);
		int id = 0;
		boolean doSomething = true;
		switch(choice)
		{
			case 1:
				Console.print("Indtast leverandørens ID.");
				id = Console.readInt();
				break;
			case 2:
				Console.print("Indtast den ønskede leverandørs ID, som står til venstre i listen af søgeresultater.");
				this.findSupplier();
				id = Console.readInt();
				break;
			case 3:
				Console.print("Indtast den ønskede leverandørs ID, som står til venstre i lisen.");
				this.showList(this.controller.getAllSuppliers());
				id = Console.readInt();
				break;
			case 0:
				doSomething = false;
				break;
		}
		if (doSomething)
		{
			Supplier supplier = this.controller.getSupplier(id);
			if(supplier != null)
			{
				return supplier;
			}
			else
			{
				Console.print("Der kunne ikke findes nogen leverandør med det valgte ID.");
				throw new Exception();
			}
		}
		else
		{
			return null;
		}
	}
	
	private int showList(ArrayList<Supplier> suppliers)
	{
		int i = 0;
		for (Supplier supplier : suppliers)
		{
			i++;
			Console.print("{"+supplier.getId()+"} "+supplier.getName()+"\t"+supplier.getPhoneNo());
		}
		return i;
	}

	private void showInfo(Supplier supplier)
	{
		Console.print("- Leverandør -");
		Console.print("ID: "+supplier.getId()+",\tNavn:"+supplier.getName());
		Console.print("Kontaktperson: "+supplier.getContact());
		Console.print("Adresse: "+supplier.getAddress());
		Console.print("Post nr./By: "+supplier.getZipCode()+" "+supplier.getCity());
		Console.print("Telefonnummer: "+supplier.getPhoneNo());
		Console.print("CVR nummmer: "+supplier.getCvr());
	}
}
